import pandas as pd
from faker import Faker

# 某公司年会设有抽奖环节，奖品设有三个等级：一等奖一名，二等奖两名，三等奖三名。要求一个人只能中一次奖。我们先构造数据：
fake = Faker(locale="zh_cn")
Faker.seed(4321)

df = pd.DataFrame(
    data=[fake.name() for _ in range(50)],
    columns=["姓名"]
)

# 增加一列用于存储抽奖结果
df["等级"] = ""

# 抽奖时执行以下代码：
# # 配置信息，第一位为抽奖人数，第二位为奖项等级
# win_info = (3, "三等奖")
# # 创建一个筛选器变量
# filter = df.index.isin(df.sample(win_info[0]).index) & ~(df["等级"].isna())
# # 执行抽奖，将等级写入
# df.loc[filter, "等级"] = win_info[1]
# # 显示本次抽奖结果
# print(df.loc[df["等级"] == win_info[1]])

# 筛选器 filter 每次用 sample 匹配出得奖的人，这些得奖的人从无等级的人中产生，接着用 loc 查出这些人，将等级写入，最后再用 loc 将本次抽奖结果筛选显示出来。
for win_info in [(3, "三等奖"), (2, "二等奖"), (1, "一等奖")]:  # (3, "三等奖") 配置信息，第一位为抽奖人数，第二位为奖项等级
    # 创建一个筛选器变量
    filter = df.index.isin(df.sample(win_info[0]).index) & ~(df["等级"].isna())
    # 执行抽奖，将等级写入
    df.loc[filter, "等级"] = win_info[1]
    # 显示本次抽奖结果
    # print(df.loc[df["等级"] == win_info[1]])

# 显示所有结果
print(df[~(df["等级"] == "")])
